/** ****************************************************************************
 * @file 	gpio.h
 * @author 	mojinpan
 * @copyright copyright (c) 2018-2020 mojinpan. All rights reserved.
 * @brief 	基于tbox的gpio库
 *
 * @version 	V1.0
 * @date 	2025-05-04
 * @details
 * 1.初稿
 *******************************************************************************/
#ifndef __GPIO_H__
#define __GPIO_H__

#include <functional>

/*******************************************************************************
								Macro Definition 宏定义
*******************************************************************************/
// PA  PB  PC  PD  PE  PF  PG  PH  PI  Pz 
// 0   16  32  48  64  80  96  112 128 400

#define SYSFS_GPIO_BI_OE 	134                 // PI6
#define SYSFS_GPIO_BI9 		128                 // PI0,PCB标识YX6
#define SYSFS_GPIO_BI10 	131                 // PI3,PCB标识YX7
#define SYSFS_GPIO_BI11		129                 // PI1,PCB标识YX8
#define SYSFS_GPIO_BI12 	130                 // PI2,PCB标识YX9
#define SYSFS_GPIO_BI13 	406                 // PZ6,PCB标识YX10
#define SYSFS_GPIO_BI14		407                 // PZ7
#define SYSFS_GPIO_BI15 	83                  // PF3
#define SYSFS_GPIO_BI16 	111                 // PG15


#define SYSFS_GPIO_BO_OE 	32                  // PC0
#define SYSFS_GPIO_BO9 		26                  // PB10
#define SYSFS_GPIO_BO10 	0                   // PA0
#define SYSFS_GPIO_BO11		96                  // PG0
#define SYSFS_GPIO_BO12 	3                   // PA3
#define SYSFS_GPIO_BO13 	97                  // PG1
#define SYSFS_GPIO_BO14		35                  // PC3
#define SYSFS_GPIO_BO15 	34                  // PG2
#define SYSFS_GPIO_BO16 	112                 // PH2

class Gpio
{
public:
	explicit Gpio(int pin, bool dir_out, bool val = false);
	virtual ~Gpio();

public:
	bool write(bool val);
	bool read(void);
	bool Toggle(void){return write(!val_);};
	using cbFunc = std::function<void (int,bool)>;
    void SetInputCallback(const cbFunc &cb); 

private:
	int pin_;				// GPIO引脚编号
	int fd_;				// GPIO设备文件描述符
	bool dir_out_;			// GPIO方向
	bool val_;				// GPIO值
	cbFunc cb_;				// GPIO输入回调函数
};

#endif
/*********************************END OF FILE**********************************/
